const userService = require('../service/user.service')
const { 
  ACCOUNT_OR_PASSWORD_IS_REQUIRED,
  ACCOUNT_IS_ALREADY_EXISTS,
  USER_ID_IS_NULL,
  USER_ID_DOES_NOT_EXIST,
  OPERATION_PERMISSION_EXCEPTION
} = require('../config/error')
const md5Password = require('../utils/md5-password')

const verifyUser = async (ctx, next) => {
  // 验证客户端传递过来的user是否可以保存到数据库中
  // 1.验证用户名和密码是否为空
  const { account, password } = ctx.request.body
  if (!account || !password) {
    return ctx.app.emit('error', ACCOUNT_OR_PASSWORD_IS_REQUIRED, ctx)
  }

  // 2.判断account是否在数据库中已经存在
  const users = await userService.findUserByAccount(account)
  if (users.length) {
    return ctx.app.emit('error', ACCOUNT_IS_ALREADY_EXISTS, ctx)
  }

  // 3.执行下一个中间件
  await next()
}

const handlePassword = async (ctx, next) => {
  // 1.取出密码
  const { password } = ctx.request.body

  // 2.对密码进行加密
  ctx.request.body.password = md5Password(password)

  // 3.执行下一个中间件
  await next()
}

const verifyUserWithId = async (ctx, next) => {
  // 1.取出id
  const { id } = ctx.params
  
  // 2.判断id是否为空
  if (!id) {
    return ctx.app.emit('error', USER_ID_IS_NULL, ctx)
  }

  // 2.判断id是否在数据库中已经存在
  const users = await userService.findUserById(id)
  if (!users || users.length === 0) {
    return ctx.app.emit('error', USER_ID_DOES_NOT_EXIST, ctx)
  }

  // 3.将查询出的user存如ctx中
  ctx.user = users[0]

  // 4.执行下一个中间件
  await next()
}

const verifyUserRole = async (ctx, next) => {
  // 1.获取token中的身份信息
  const { roleId } = ctx.user

  // 2.判断是否为管理员身份
  if (roleId !== 1) {
    return ctx.app.emit('error', OPERATION_PERMISSION_EXCEPTION, ctx)
  }
  // 3.执行下一个中间件
  await next()
}

module.exports = {
  verifyUser,
  handlePassword,
  verifyUserWithId,
  verifyUserRole
}